Constant highlighting no longer captures Java annotations
authorVincenzo Pupillo <v.pupillo@gmail.com>
Wed, 22 Jan 2025 15:14:41 +0000 (16:14 +0100)
committerStefan Kangas <stefankangas@gmail.com>
Sun, 23 Feb 2025 19:48:13 +0000 (20:48 +0100)
* lisp/progmodes/java-ts-mode.el
(java-ts-mode--fontify-constant): New function.
(java-ts-mode--font-lock-settings): Use it.

lisp/progmodes/java-ts-mode.el

index 6823cb4f38ab66ab6f004d4dcd1c02eaf3fa5d22..849ab23ef3e2235a0927606696817761a89466d6 100644 (file)
@@ -164,6 +164,23 @@ the available version of Tree-sitter for Java."
     (error
      `((string_literal) @font-lock-string-face))))
 
+(defun java-ts-mode--fontify-constant (node override start end &rest _)
+  "Fontify a Java constant.
+In Java the names of variables declared class constants and of ANSI
+constants should be all uppercase with words separated by underscores.
+This function also prevents annotations from being highlighted as if
+they were constants.
+For NODE, OVERRIDE, START, and END, see `treesit-font-lock-rules'."
+  (let ((node-start (treesit-node-start node))
+       (case-fold-search nil))
+    (when (and
+          (not (equal (char-before node-start) ?@)) ;; skip annotations
+          (string-match "\\`[A-Z_][0-9A-Z_]*\\'" (treesit-node-text node)))
+      (treesit-fontify-with-override
+       node-start (treesit-node-end node)
+       'font-lock-constant-face override
+       start end))))
+
 (defvar java-ts-mode--font-lock-settings
   (treesit-font-lock-rules
    :language 'java
@@ -174,8 +191,7 @@ the available version of Tree-sitter for Java."
    :language 'java
    :override t
    :feature 'constant
-   `(((identifier) @font-lock-constant-face
-      (:match "\\`[A-Z_][0-9A-Z_]*\\'" @font-lock-constant-face))
+   `((identifier) @java-ts-mode--fontify-constant
      [(true) (false)] @font-lock-constant-face)
    :language 'java
    :override t